https://leetcode.cn/problems/cut-off-trees-for-golf-event/description/
//class Solution {
//public:
//    int m, n;
//    int cutOffTree(vector<vector<int>>& forest) {
//        m = forest.size(), n = forest[0].size();
//        vector<pair<int, int>> trees;
//
//        for (int i = 0; i < m; i++) {
//            for (int j = 0; j < n; j++) {
//                if (forest[i][j] > 1) trees.push_back({ i,j });
//            }
//        }
//
//        sort(trees.begin(), trees.end(), [&](const pair<int, int>& p1, const pair<int, int>& p2) {
//            return forest[p1.first][p1.second] < forest[p2.first][p2.second];
//            });
//
//        int sum = 0;
//        int bx = 0, by = 0;
//        for (auto [a, b] : trees) {
//            int step = bfs(forest, bx, by, a, b);
//            if (step == -1) {
//                return -1;
//            }
//            sum += step;
//            bx = a, by = b;
//        }
//        return sum;
//    }
//    bool vis[51][51];
//    int dx[4] = { 0,0,-1,1 };
//    int dy[4] = { 1,-1,0,0 };
//
//    int bfs(vector<vector<int>>& forest, int bx, int by, int ex, int ey) {
//
//        if (bx == ex && by == ey) {
//            return 0;
//        }
//        memset(vis, 0, sizeof vis);
//        queue<pair<int, int>> q;
//        q.push({ bx,by });
//        vis[bx][by] = true;
//        int step = 0;
//
//        while (q.size()) {
//            step++;
//            int sz = q.size();
//            while (sz--) {
//                auto [a, b] = q.front();
//                q.pop();
//                for (int k = 0; k < 4; k++) {
//                    int x = dx[k] + a;
//                    int y = dy[k] + b;
//                    if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && forest[x][y]) {
//                        if (x == ex && y == ey) {
//                            return step;
//                        }
//                        vis[x][y] = true;
//                        q.push({ x,y });
//                    }
//                }
//            }
//        }
//        return -1;
//    }
//};


https://leetcode.cn/problems/word-ladder/description/
//class Solution {
//public:
//    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
//        unordered_set<string> vis;
//        unordered_set<string> hash(wordList.begin(), wordList.end());
//
//        if (beginWord == endWord) {
//            return 0;
//        }
//        if (!hash.count(endWord)) {
//            return 0;
//        }
//
//        int size = endWord.size();
//        queue<string> q;
//        q.push(beginWord);
//        vis.insert(beginWord);
//        int sum = 1;
//
//        while (q.size()) {
//            sum++;
//            int sz = q.size();
//            while (sz--) {
//                string s = q.front();
//                q.pop();
//
//                for (int i = 0; i < size; i++) {
//                    string tmp = s;
//                    for (int j = 0; j < 26; j++) {
//                        tmp[i] = (j + 'a');
//                        if (hash.count(tmp) && !vis.count(tmp)) {
//                            if (tmp == endWord) {
//                                return sum;
//                            }
//                            vis.insert(tmp);
//                            q.push(tmp);
//                        }
//                    }
//                }
//            }
//        }
//        return 0;
//    }
//};